package com.example.demo.controller.system;

import com.example.demo.common.page.PageResult;
import com.example.demo.common.result.R;
import com.example.demo.dto.system.UserDTO;
import com.example.demo.dto.system.UserQueryDTO;
import com.example.demo.entity.system.SysUser;
import com.example.demo.service.system.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 用户管理控制器
 */
@RestController
@RequestMapping("/api/users")
public class SysUserController {

    @Autowired
    private SysUserService userService;

    /**
     * 分页查询用户列表
     */
    @GetMapping
    public R<PageResult<SysUser>> page(UserQueryDTO queryDTO) {
        PageResult<SysUser> pageResult = userService.selectUserPage(queryDTO);
        return R.ok(pageResult);
    }
    
    /**
     * 查询用户列表
     */
    @GetMapping("/list")
    public R<List<SysUser>> list(SysUser user) {
        List<SysUser> list = userService.selectUserList(user);
        return R.ok(list);
    }
    
    /**
     * 获取用户详细信息
     */
    @GetMapping("/{userId}")
    public R<UserDTO> getInfo(@PathVariable("userId") Long userId, @RequestParam(required = false) String systemCode) {
        UserDTO userDTO = userService.selectUserDetail(userId, systemCode);
        if (userDTO == null) {
            return R.fail("用户不存在");
        }
        
        // 不返回密码
        userDTO.getUser().setPassword(null);
        return R.ok(userDTO);
    }
    
    /**
     * 新增用户
     */
    @PostMapping
    public R<SysUser> add(@RequestBody UserDTO userDTO) {
        // 校验用户名是否唯一
        if (!userService.checkUsernameUnique(userDTO.getUser().getUsername())) {
            return R.fail("用户名已存在");
        }
        
        // 校验手机号是否唯一
        if (StringUtils.hasText(userDTO.getUser().getPhone()) && !userService.checkPhoneUnique(userDTO.getUser())) {
            return R.fail("手机号已存在");
        }
        
        // 校验邮箱是否唯一
        if (StringUtils.hasText(userDTO.getUser().getEmail()) && !userService.checkEmailUnique(userDTO.getUser())) {
            return R.fail("邮箱已存在");
        }
        
        // 设置默认值
        if (userDTO.getUser().getStatus() == null) {
            userDTO.getUser().setStatus(1);
        }
        
        int rows = userService.insertUser(userDTO);
        if (rows > 0) {
            return R.ok(userDTO.getUser());
        }
        return R.fail("添加失败");
    }
    
    /**
     * 修改用户
     */
    @PutMapping("/{userId}")
    public R<Void> edit(@PathVariable("userId") Long userId, @RequestBody UserDTO userDTO) {
        // 检查用户是否存在
        SysUser existUser = userService.selectUserById(userId);
        if (existUser == null) {
            return R.fail("用户不存在");
        }
        
        userDTO.getUser().setId(userId);
        
        // 校验手机号是否唯一
        if (StringUtils.hasText(userDTO.getUser().getPhone()) && !userService.checkPhoneUnique(userDTO.getUser())) {
            return R.fail("手机号已存在");
        }
        
        // 校验邮箱是否唯一
        if (StringUtils.hasText(userDTO.getUser().getEmail()) && !userService.checkEmailUnique(userDTO.getUser())) {
            return R.fail("邮箱已存在");
        }
        
        int rows = userService.updateUser(userDTO);
        return rows > 0 ? R.ok() : R.fail("修改失败");
    }
    
    /**
     * 修改用户状态
     */
    @PutMapping("/{userId}/status")
    public R<Void> changeStatus(@PathVariable("userId") Long userId, @RequestBody Map<String, Integer> params) {
        // 检查用户是否存在
        SysUser existUser = userService.selectUserById(userId);
        if (existUser == null) {
            return R.fail("用户不存在");
        }
        
        Integer status = params.get("status");
        if (status == null || (status != 0 && status != 1)) {
            return R.fail("状态值无效");
        }
        
        int rows = userService.updateUserStatus(userId, status);
        return rows > 0 ? R.ok() : R.fail("状态修改失败");
    }
    
    /**
     * 删除用户
     */
    @DeleteMapping("/{userId}")
    public R<Void> remove(@PathVariable("userId") Long userId) {
        // 检查用户是否存在
        SysUser existUser = userService.selectUserById(userId);
        if (existUser == null) {
            return R.fail("用户不存在");
        }
        
        int rows = userService.deleteUserById(userId);
        return rows > 0 ? R.ok() : R.fail("删除失败");
    }
    
    /**
     * 批量删除用户
     */
    @DeleteMapping("/batch/{userIds}")
    public R<Void> batchRemove(@PathVariable("userIds") Long[] userIds) {
        int rows = userService.deleteUserByIds(userIds);
        return rows > 0 ? R.ok() : R.fail("批量删除失败");
    }
    
    /**
     * 用户登录
     */
    @PostMapping("/login")
    public R<SysUser> login(@RequestParam String username, @RequestParam String password) {
        SysUser user = userService.login(username, password);
        if (user != null) {
            // 不返回密码
            user.setPassword(null);
            return R.ok(user);
        }
        return R.fail("用户名或密码错误");
    }
}